import java.util.Scanner;

public class Main {

    //挖矿
    static final int N = (int)1e6 + 10; // 基础偏移量

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] sum = new int[2 * N]; // 因为有负数，所以需要至少开辟两倍空间

        // n 为矿洞数量，m 为步数
        int n = scanner.nextInt();
        int m = scanner.nextInt();

        // 填充计数数组，表明该下标存在矿洞
        for (int i = 0; i < n; i++) {
            int x = scanner.nextInt();
            // sum 数组原本默认都为 0 ，输入的小标存在矿洞，则该下标的值 ++ ，表示有一个矿洞
            sum[x + N]++;
        }

        // 计算前缀和
        for (int i = 1; i < 2 * N; i++) {
            sum[i] += sum[i - 1];
        }

        int ans = 0;
        // 左侧拐点扫描
        for (int i = 1; i <= N; i++) {
            if (N - i <= m) {
                //这时候确定左拐点：l
                int l = i;
                int r = Math.max(N, N + (m - 2 * (N - i)));
                ans = Math.max(ans, sum[r] - sum[l - 1]);
            }
        }

        // 右侧拐点扫描
        for (int i = N; i < 2 * N; i++) {
            if (i - N <= m) {
                //这时候确定右拐点：r
                int r = i;
                int l = Math.min(N, N - (m - 2 * (i - N)));
                ans = Math.max(ans, sum[r] - sum[l - 1]);
            }
        }

        System.out.println(ans);
        scanner.close();
    }
}
